iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
Software Development

六邊形戰士程式設計系列 第 27

D27 - MMORPG事件處理問題 集中處理篇

  • 分享至 

  • xImage
  •  

時間拉回到兩天前, D25 - MMORPG事件處理問題 壅塞控制篇 的結論是

如果要解決壅塞問題,我們可以每一段時間把事件蒐集起來集中處理

基於昨天的RxJS程式,我們再插入一個 bufferTime 函式

rx.merge(觀察刀賊移動, 觀察刀賊動作)
  .pipe(rx.bufferTime(3000))
  // 把三秒內的事件打包成陣列,如果三秒內沒有事件發生,則會回傳空陣列
  .subscribe((events) => {
    for (let e of events) {
      map.on(e);
    }
    console.clear();
    console.log(visualize(map));
  });

執行程式後就能看到狀態跳轉變成每三秒一次囉~

最後再補充一個之前沒有做好的部分,本來觀察刀賊動作可能會回傳undefined

const 觀察刀賊動作 = rx
  .timer(2500, tick)
  .pipe(rx.take(15))
  .pipe(
    rx.map((_, i) => (i == 10 ? 刀賊迴旋斬 : i == 11 ? 刀賊撿取 : undefined))
  )
  
// type signature : 
// const 觀察刀賊動作: rx.Observable<AttackEvent | PickEvent | undefined>

這會導致後面還有新增 if 判斷把 undefined 的情況排除

rx.merge(觀察刀賊移動, 觀察刀賊動作).subscribe((event) => {
  if (event) {
    map.on(event);
    console.clear();
    console.log(visualize(map));
  }
});

但我們如果提早用 filter 把 undefined 排除掉

const 觀察刀賊動作 = rx
  .timer(2500, tick)
  .pipe(rx.take(15))
  .pipe(
    rx.map((_, i) => (i == 10 ? 刀賊迴旋斬 : i == 11 ? 刀賊撿取 : undefined))
  )
  .pipe(rx.filter((event) => event !== undefined));

後面就可以不用擔心 event 可能為空的情形了

rx.merge(觀察刀賊移動, 觀察刀賊動作).subscribe((event) => {
    map.on(event);
    console.clear();
    console.log(visualize(map));
});

今天下班想說小睡一下,結果睡過頭了 ...
但即使沒有獎牌也不能放棄! 沒有每天準時發文,至少要在30天內把30篇寫完!
/images/emoticon/emoticon02.gif


上一篇
D26 - MMORPG事件處理問題 動畫化篇
下一篇
D28 - MMORPG事件處理問題 多語言篇
系列文
六邊形戰士程式設計30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言